<?php
/**
*文件处理类，包含文件上传和制作缩略图
*@return string 返回上传文件的文件名
*/
class UploadLib {
	private $error=array();	//用来保存上传的错误编号
        private $type=array();
	//通过构造函数初始化上传的成员变量
        
	public function __construct() {
            $this->type=  explode('|', UPLOAD_TYPE);
	}
	//获取错误
	public function getError() {
		return implode('<br>',$this->error);
	}
	//验证文件上传是否有误
	private function checkError($file) {
		$error=$file['error'];	//错误编码
		if($error!=0){
			switch($error) {
				case 1:
					$this->error[]='上传文件大小超出了php.ini配置文件允许的最大值';
					break;
				case 2:
					$this->error[]='上传文件大小超出了表单允许的最大值';
					break;
				case 3:
					$this->error[]='文件只有部分上传';
					break;
				case 4:
					$this->error[]='没有文件上传';
					break;
				case 6:
					$this->error[]='找不到临时文件';
					break;
				case 7:
					$this->error[]='文件写入失败';
					break;
				default:
					$this->error[]='未知错误';
			}
		}
	}
	//验证上传的文件格式是否正确,只允许jpg、gif、png三种格式
	private function checkType($file) {
		if(!in_array($file['type'],$this->type))
			$this->error[]='错误文件类型，允许的类型是:'.implode(',',$this->type);
	}
	//验证大小
	private function checkSize($file) {
		if($file['size']>UPLOAD_SIZE) {
			$this->error[]='文件大小不能超过'.UPLOAD_SIZE.'个字节';
		}
	}
	//判断上传是否是HTTP上传
	private function checkHttpUpload($file) {
		if(!is_uploaded_file($file['tmp_name'])) {
			$this->error[]='文件必须是HTTP上传的';
		}
	}
	/**
	*文件上传的方法
	*@param array $_FILES[]对象
	*/
	public function upload($file) {
            if($file['name']==''){
                return '';  //返回空字符串表示没有文件上传
            }
                $foldername=date('Y-m-d');  //以年月日文件文件夹的名称
                $folderpath=UPLOAD_PATH.$foldername;    //文件夹路径
                if(!file_exists($folderpath)){
                    mkdir($folderpath);
                }
		$this->checkError($file);
		$this->checkType($file);
		$this->checkSize($file);
		$this->checkHttpUpload($file);
		if(!empty($this->error))
			return false;
		//文件上传
		$filename=uniqid('',true).strrchr($file['name'],'.');
		$filepath=$folderpath.DS.$filename;
		if(move_uploaded_file($file['tmp_name'],$filepath))
			return $foldername.'/'.$filename;
		return false;
	}
	/**
	*生成缩略图
	*@param $src_file	string  源图的路径
	*@param $max_w int	目标最大宽度
	*@param $max_h int  目标最大高度
	*@param $pro bool  是否等比
	*@param $prefix		缩略图前缀
	*@return string 缩略图的名称
	*/
	public function thumb($src_file,$max_w=100,$max_h=100,$pro=false,$prefix='s_') {
		$ext=strtolower(strrchr($src_file,'.'));
		switch($ext) {
			case '.jpg':
			case '.jpeg':
				$type='jpeg';
				break;
			case '.gif':
				$type='gif';
				break;
			case '.png':
				$type='png';
				break;
			default:
				$this->error[]='类型错误';
				return false;
		}
		$openfun='imagecreatefrom'.$type;	//拼接打开图片的函数
		$src=$openfun($src_file);	//打开源图
		//创建目标图
		$dst=imagecreatetruecolor($max_w,$max_h);
		$color=imagecolorallocate($dst,255,255,255);
		imagefill($dst,0,0,$color);
		$src_w=imagesx($src);			//源图的宽度
		$src_h=imagesy($src);			//源图的高度
		//求目标宽度和高度
		if($pro){
			if($src_w/$src_h>$max_w/$max_h){
				$dst_w=$max_w;
				$dst_h=$dst_w*$src_h/$src_w;
			}else{
				$dst_h=$max_h;
				$dst_w=$dst_h*$src_w/$src_h;
			}
		}else{
			$dst_w=$max_w;
			$dst_h=$max_h;
		}
		$dst_w=(int)$dst_w;
		$dst_h=(int)$dst_h;
		//求目标点的位置
		$dst_x=($max_w-$dst_w)/2;
		$dst_y=($max_h-$dst_h)/2;
		//制作缩略图
		imagecopyresampled($dst,$src,$dst_x,$dst_y,0,0,$dst_w,$dst_h,$src_w,$src_h);
		//保存
		$savefun='image'.$type;
		$smallpath=dirname($src_file).'/'.$prefix.basename($src_file);
		$savefun($dst,$smallpath);
		imagedestroy($src);
		imagedestroy($dst);
		return $prefix.basename($src_file);
	}
}